const http = require('http')
const path = require('path')
const fs = require('fs')
const url = require('url')
const md5 = require('md5')

// 根目录  / => 服务器中的地址
const webRoot = path.resolve('./template')

// 服务器端渲染 
http.createServer((req, res) => {
  let { pathname } = url.parse(req.url, true)
  pathname = pathname == '/' ? '/index.html' : pathname
  if ('/favicon.ico' == pathname) return;
  // 针对于图片来设置缓存
  let extname = path.extname(pathname)
  let filepath = path.join(webRoot, pathname)

  if (/\.(jpe?g|png|gif|webp)/i.test(extname)) { // 图片处理
    // 强缓存和协商缓存同时有效时，强缓存要优先协商
    // 强缓存设置，在服务器端直接设置，浏览器被动执行
    // 时间为GMT格式  http1.0
    res.setHeader("Expires", new Date(Date.now() + 300 * 1000).toGMTString())
    // 单位秒 http1.1
    res.setHeader('Cache-Control', 'max-age=300')

    // 协商缓存
    // console.log(req.headers)
    // 第1次请求没有发现在请求头中有对应的客户端发送过来的请求头
    // 没有资源没有进行过缓存设置,需要来处理协商缓存需要物料
    // http1.0
    let stat = fs.statSync(filepath)
    // 文件的修改时间
    let mtime = new Date(stat.mtime).toGMTString()
    // 如果请求头信息中有对应的标识时间岀进行比对
    if (req.headers['if-modified-since']) {
      if (req.headers['if-modified-since'] == mtime) {
        res.statusCode = 304
        res.end('')
        return;
      }
    }
    res.setHeader('Last-Modified', mtime)
    // http1.1
    let fileData = fs.readFileSync(filepath)
    let etag = md5(fileData)
    if (req.headers['if-none-match']) {
      if(etag == req.headers['if-none-match']) {
        res.statusCode = 304
        res.end('')
        return;
      }
    }
    res.setHeader('Etag', etag)

  }





  let html = fs.readFileSync(filepath)
  res.end(html)
}).listen(3000, () => console.log('http://localhost:3000'))